           BOI.10.(Numere mari). Un num[r natural n scris n baza zece avnd k
cifre, 25k80, se numete mare.
           S[ se scrie un program care, pentru un num[r mare n determin[ cel mai
mare ntreg p astfel nct p3+p2+3pn.
Intrare: Intrarea va fi un fiier ASCII n care pe prima linie se afl[ un num[r
ntreg k. Pe linia urm[toare se afl[ un num[r mare n cu k cifre zecimale.
Ieire: Ieirea va fi standard (ecran) i afieaz[ num[rul p.
Exemplu: Pentru intrarea:
46
1000000000000001000000000000003000000000000001
  programul va afia:
1000000000000000
============================================
          BOI 10.. (Gheorghi[ Valentin, Ploieti) 
           Problema cu numere mari este rezolvat[ ntr-un algoritm care determin[
iniial num[rul de cifre al lui p, dup[ care determin[, innd cont de inecuaia ce
trebuie satisfacut[ de p, pe rnd cifrele lui ncepnd cu cea mai din stnga
("dominanta"). Algoritmul este de complexitate polinomial[.
program Numere_mari;
uses crt;
var n,p:string;
    l:byte;
    i,k:byte;
    contor:integer;
    control:boolean;
    ast:byte;
------------------------------------------------------------
function sumita(t1,t2:string):string;
var total:string;
    suma,max,i,ast,nr1,nr2:integer;
    cif1,cif2:byte;
    error:integer;
 begin
  nr1:=length(t1); nr2:=length(t2); total:='';
  ast:=0; max:=nr1;
  if max<nr2 then max:=nr2;
  for i:=1 to max do begin
    suma:=ast;
    val(t1[nr1+1-i],cif1,error); val(t2[nr2+1-i],cif2,error);
    if i<=nr1 then suma:=suma+cif1;
    if i<=nr2 then suma:=suma+cif2;
    ast:=trunc(suma/10);
    total:=chr(48+suma-ast*10)+total;
                     end;
  if ast<>0 then total:=chr(48+ast)+total;
  sumita:=total;
 end;
------------------------------------------------------
function produs(t1,t2:string):string;
  var total,temp:string;
      nr1,nr2,cif1,cif2:byte;
      prod,i,j,error:integer;
begin
  nr1:=length(t1); nr2:=length(t2);
  total:='';
  for i:=1 to nr1+nr2 do total:=total+'0';
  for i:=1 to nr1 do begin
     temp:=''; ast:=0;
     for j:=1 to nr2+1 do temp:=temp+'0';
     for j:=nr2 downto 1 do begin
       val(t1[nr1-i+1],cif1,error); val(t2[j],cif2,error);
       prod:=cif1*cif2+ast;
       ast:=trunc(prod/10);
       temp[j+1]:=chr(48+prod-ast*10);
                            end;
    temp[1]:=chr(ast+48);
    for j:=1 to i-1 do temp:=temp+'0';
    total:=sumita(total,temp);
                    end;
 nr1:=length(total);
 if total[1]='0' then begin
       temp:='';
       for i:=2 to nr1 do temp:=temp+total[i];
       total:=temp  end;
  produs:=total;
 end;
----------------------------------------------------------
procedure functie;
var s1,s2,s3,s4:string;
    i:integer;
    mm:boolean;
begin
  s1:=produs('3',p); s2:=produs(p,p); s3:=produs(p,s2);
  s4:=sumita(sumita(s1,s2),s3);
  if length(s4)>k then control:=true;
  if length(s4)=k then begin
      mm:=false;
      for i:=1 to k do
         if not(mm) then begin
            if s4[i]<>n[i] then mm:=true;
            if s4[i]>n[i] then control:=true
                     end  end
end;
-----------------------------------------------------
begin
  clrscr;
  write('Introduceti n : '); readln(n);
  k:=length(n); l:=trunc((k+2)/3); p:='';
  for i:=1 to l do p:=p+'0';
  contor:=0; control:=false;
  repeat
    contor:=contor+1; p[1]:=chr(48+contor);
    functie;
  until ((control) or (contor=9));
  if control then p[1]:=chr(48+contor-1);
  if p[1]='0' then p[1]:='1';
  for i:=2 to l do begin
   contor:=-1; control:=false;
   repeat
     contor:=contor+1; p[i]:=chr(48+contor);
     functie;
   until ((control) or (contor=9));
   if ((control) and (p[i]<>'0')) then p[i]:=chr(48+contor-1);
                   end;
  control:=false; functie;
  if control then begin
     p:='';
     for i:=1 to l-1 do p:=p+'9';
                  end;
 writeln('Numarul p este ',p);
 repeat until keypressed;
end.
---------------------------------------------
